# frozen_string_literal: true

# 处理与 dotfiles 相关

require_relative 'shell'

class Dotfiles
  # 提供复制 dotfiles 中的配置文件到宿主机的执行环境。
  #
  # 首先，会执行相关的路径检查，确保本次配置流畅进行；然后，执行用户传递的块；最后，真正地执行配置文件的复制和备份。
  def around(file_in_dotfiles, rc_file, customized_no_dotfiles_error = nil)
    bak_file = "#{rc_file}.bak"

    path_in_dotfiles = shell.expand(file_in_dotfiles)
    rc_path = shell.expand(rc_file)
    bak_path = shell.expand(bak_file)

    no_dotfiles_error = customized_no_dotfiles_error || "未发现来自于 dotfiles 项目的配置文件路径：#{file_in_dotfiles}"
    shell.exit Shell::Errors::FILE_NOT_FOUND, no_dotfiles_error unless File.exist?(path_in_dotfiles)
    if File.exist?(rc_path) && File.exist?(bak_path)
      shell.exit Shell::Errors::BACKUP_FILE_EXIST, "无法备份 #{bak_file}，因为该文件已存在"
    end

    yield

    FileUtils.cp rc_path, bak_path if File.exist?(rc_path)
    FileUtils.cp path_in_dotfiles, rc_path
  end
end

dotfiles = Dotfiles.new

define_method(:dotfiles) { dotfiles }
